package part09_享元模式_展示网站.Integer源码分析;

/**
 * @ClassName: FlyWeight
 * @Author: AllenSun
 * @Date: 2020/3/2 23:24
 */
public class FlyWeight {
    public static void main(String[] args) {
        //127在范围内，缓存池没对象，创建一个x对象实例
        Integer x=Integer.valueOf(127);
        //创建一个y对象实例
        Integer y=new Integer(127);
        //127在范围内，缓存池有对象，不创建，直接用x对象实例
        Integer z=Integer.valueOf(127);
        //创建一个w对象实例
        Integer w=new Integer(127);

        /**valueOf的源码
         * 如果值在[-128,127]范围内，就从缓存池里直接取对象实例（享元模式）
         * Integer.IntegerCache.cache[var0 + 128]
         * 如果超出这个范围呢，那就亲自创建一个对象实例
         * new Integer(var0)
         *
         */

        //x和y两个值相同，虽然地址不同，但是equals只判断值====true
        //equals判断“值”者是不是相等，==判断“值+地址”两者是不是相等
        System.out.println(x.equals(y));
        //false====y用了new关键字，重新创建了实例，两者地址不同
        System.out.println(x==y);
        //true====x和z是重复的实例，没有重复创建(不是用new创建)，用的是同一个，所以地址相同
        System.out.println(x==z);
        //false====w和z(x)不是同一个对象
        System.out.println(w==x);
        //false====w和y，都是用new创建的，是两个不同的对象实例
        System.out.println(w==y);



        Integer m=Integer.valueOf(200);
        Integer n=Integer.valueOf(200);
        //结果为false，因为200超出了[-128,127]的范围，就用new创建新的对象实例了
        //所以m和n不是用的同一个对象实例
        System.out.println(m==n);


    }


}
